perm filename FTPS.C[11,HE] blob
sn#688213 filedate 1982-12-06 generic text, type T, neo UTF8
/*
* eftpsend.c
*
* Simple eftp sender program; not as flexable as "eftp", but
* does Pup internet routing right.
*
* Jeffrey Mogul 6 November 1981 Stanford University
*
* Synopsis:
* eftpsend hostname filename [key]
*
* key is initial letter(s) of: debug, unswap
* (n.b.: "unswap" is wrt local byte order; the default
* on Vax-to-dover transfers is "swap")
*
* This program is roughly equivalent to
* "eftp reqs" <hostname> <filename>
*/
#include <stdio.h>
#include <eftp.h>
#include <pupstatus.h>
#include <pupconstants.h>
#define BUFFERSIZE 512
#define CHAN_TIMEOUT 30 /* seconds */
#define DEBUG if (debug) printf
char buf[BUFFERSIZE];
/* flags */
int debug = 0;
int unswap = 0;
main(argc,argv)
int argc;
char **argv;
{ /* */
struct EftpChan ec;
struct Port remport;
int i;
int stat;
int done = 0;
int tsize;
int rsize;
int fileid;
long tstart;
if ((argc > 4) || (argc < 3)) {
fprintf(stderr,"Usage: eftpsend hostname filename [du]\n");
exit(1);
}
if (argc == 4) { /* key to be parsed */
char *kp = argv[3];
while (*kp) {
switch (*kp) {
case 'd': debug++;
break;
case 'u': unswap++;
break;
default: fprintf(stderr,"Unknown key: %c\n",*kp);
exit(1);
}
kp++;
}
}
if ((fileid = open(argv[2],0)) == -1) {
perror("eftpsend");
fprintf(stderr,"[open failed on %s]\n",argv[2]);
exit(1);
}
ReLookup:
switch (mlookup(argv[1],&remport)) {
case OK:
DEBUG("Host:%s is ",argv[1]);
if (debug) {
PortPrint(&remport);
printf("\n");
}
break;
case NOTFOUND:
fprintf(stderr,"[Host %s name not found]\n",argv[1]);
exit(1);
case NOCHAN:
DEBUG("Waiting for free network channel\n");
sleep(30);
goto ReLookup;
case TIMEOUT:
fprintf(stderr,"[Name server did not respond]\n");
exit(1);
default:
fprintf(stderr,
"[eftpsend: internal error in lookup]\n");
exit(1);
}
/* get first bufferfull */
rsize = read(fileid,buf, sizeof buf);
DEBUG("Read size = %d\n",rsize);
if (rsize == 0) {
fprintf(stderr,"[File %s is empty]\n",argv[2]);
exit(0);
}
Restart:
/* EfSendOpen(Efchan, Dest, timeout, bswap?) */
#ifdef PUP__NNSO
switch(EfSendOpen(&ec, &remport, CHAN_TIMEOUT, unswap)) {
#else
switch(EfSendOpen(&ec, &remport, CHAN_TIMEOUT, !unswap)) {
#endif
case OK:
DEBUG("Open OK\n");
break;
case NOCHAN:
DEBUG("Waiting for free network channel\n");
sleep(30);
goto Restart;
case NOROUTE:
fprintf(stderr,"[Cannot get to %s from here]\n",
argv[1]);
exit(1);
}
tstart = time(0);
tsize = 0;
while (!done) {
switch(stat = EftpWrite(&ec,buf,rsize)) {
case OK:
tsize += rsize; /* add in OLD rsize */
if ((rsize = read(fileid, buf, sizeof buf)) == 0)
done++; /* done if EOF */
DEBUG("sent OK; next read size is %d\n",rsize);
break;
case TIMEOUT:
fprintf(stderr,"[send timed out]\n");
EfSendEnd(&ec); /* maybe server still listening */
exit(1);
case EFTP_ABORT:
fprintf(stderr,"[Abort code %o: %s]\n",
EftpAbortCode,EftpErrMsg);
exit(1);
case EFTP_WAIT:
switch (EftpAbortCode) {
case EFTPA_LONGWAIT:
DEBUG("waiting %d seconds\n",EFTPW_LWAIT);
sleep(EFTPW_LWAIT);
break;
case EFTPA_MEDWAIT:
DEBUG("waiting %d seconds\n",EFTPW_MWAIT);
sleep(EFTPW_MWAIT);
break;
case EFTPA_RECBUSY:
DEBUG("waiting %d seconds\n",EFTPW_RBUSY);
sleep(EFTPW_RBUSY);
break;
default:
fprintf(stderr,"[eftpsend: internal error, ");
fprintf(stderr,"inconsistent abort code:\n");
fprintf(stderr,"status = %o\n",stat);
fprintf(stderr,"abort code = %o :%s :%s]\n",
EftpAbortCode,EftpErrMsg,PupErrMsg);
exit(1);
}
goto Restart;
case EFTP_ERROR:
fprintf(stderr,"[eftpsend: EFTP protocol error]\n");
exit(1);
case EFTP_RESTART:
DEBUG("eftp restart\n");
goto Restart;
default:
fprintf(stderr,"[eftpsend: internal error,");
fprintf(stderr,"status = %o\n",stat);
fprintf(stderr,"abort code = %o :%s :%s]\n",
EftpAbortCode,EftpErrMsg,PupErrMsg);
exit(1);
}
}
EfSendEnd(&ec); /* end the transfer */
EfSendClose(&ec);
tstart -= time(0);
DEBUG("time = %d, rate = %d\n",-tstart,-(tsize*8)/tstart);
exit(0);
}